package com.tao.base.config;

import feign.codec.Encoder;
import feign.form.spring.SpringFormEncoder;
import org.springframework.beans.factory.ObjectFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.http.HttpMessageConverters;
import org.springframework.cloud.openfeign.support.SpringEncoder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.context.annotation.Scope;
import org.springframework.mock.web.MockMultipartFile;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.nio.file.Files;

/**
 * @author Mr.M
 * @version 1.0
 * @description TODO
 * @date 2022/10/15 22:13
 */
@Configuration
public class MultipartSupportConfig {
    @Autowired
    private ObjectFactory<HttpMessageConverters> messageConverters;
    @Bean
    @Primary
    @Scope("prototype")
    public Encoder feignEncoder() {
        return new SpringFormEncoder(new SpringEncoder(messageConverters));
    }
    // 将 File 转为 MultipartFile 的方法
    public static MultipartFile getMultipartFile(File file) {
        try {
            return new MockMultipartFile(
                    "file",  // 参数名
                    file.getName(),  // 原始文件名
                    Files.probeContentType(file.toPath()),  // 文件 MIME 类型
                    Files.readAllBytes(file.toPath())  // 文件内容
            );
        } catch (IOException e) {
            throw new RuntimeException("文件转换失败", e);
        }
    }
    // 如果需要更细粒度的控制，可以使用以下方法
    public static MultipartFile getMultipartFileWithStream(File file) {
        try (FileInputStream inputStream = new FileInputStream(file)) {
            return new MockMultipartFile(
                    "file",  // 参数名
                    file.getName(),  // 原始文件名
                    Files.probeContentType(file.toPath()),  // 文件 MIME 类型
                    inputStream  // 文件输入流
            );
        } catch (IOException e) {
            throw new RuntimeException("文件转换失败", e);
        }
    }

}
